import os
import shutil
import re
import sys


def get_user_input(prompt):
    """安全获取用户输入（兼容中文路径）"""
    try:
        return input(prompt)
    except UnicodeDecodeError:
        # 处理中文路径编码问题
        return input(prompt.encode('gbk', 'ignore').decode('gbk'))


def classify_and_move_files(source_folder, base_target_folder):
    """
    根据文件名规则分类移动文件

    规则说明：
    - 包含_A或_B + .jpg -> 目标: {数字部分}\IMG\压缩
    - 包含_A或_B + .tif -> 目标: {数字部分}\IMG\原始
    - 包含_F或_Z + .jpg -> 目标: {数字部分}\PIC\压缩
    - 包含_F或_Z + .TIF -> 目标: {数字部分}\PIC\原始
    """
    # 确保源文件夹存在
    if not os.path.exists(source_folder):
        print(f"错误: 源文件夹 '{source_folder}' 不存在")
        return

    # 遍历所有文件
    for filename in os.listdir(source_folder):
        # 跳过非图片文件（支持所有常见图片格式）
        if not filename.lower().endswith(('.jpg', '.jpeg', '.tif', '.tiff')):
            continue

        # 提取数字部分 (前8位)
        num_part = filename[:8]
        if not num_part.isdigit():
            print(f"跳过: 文件名前8位非数字 - {filename}")
            continue

        # 提取类型标识 (下划线后的第一个字母)
        parts = filename.split('_')
        if len(parts) < 2:
            print(f"跳过: 文件名格式错误 - {filename}")
            continue

        type_char = parts[1].upper()  # 转为大写统一处理
        file_ext = os.path.splitext(filename)[1].lower()  # 扩展名转小写

        # 根据规则确定目标目录
        if type_char[0] in ['A', 'B']:
            main_dir = "IMG"
            sub_dir = "压缩" if file_ext in ['.jpg', '.jpeg'] else "原始"
        elif type_char[0] in ['F', 'Z']:
            main_dir = "PIC"
            sub_dir = "压缩" if file_ext in ['.jpg', '.jpeg'] else "原始"
        else:
            print(f"跳过: 未知类型标识 - {type_char} in {filename}")
            continue

        # 构建完整目标路径
        target_folder = os.path.join(base_target_folder, num_part, main_dir, sub_dir)
        os.makedirs(target_folder, exist_ok=True)

        # 源文件路径
        source_file = os.path.join(source_folder, filename)
        target_file = os.path.join(target_folder, filename)

        # 拷贝文件 (避免覆盖)
        if not os.path.exists(target_file):
            shutil.copy2(source_file, target_file)
            print(f"移动成功: {filename} -> {target_file}")
        else:
            print(f"跳过: 文件已存在 - {filename}")


def main():
    """主程序入口"""
    print("=" * 50)
    print("图片分类移动工具 - 交互式输入版本")
    print("支持中文路径，自动处理大小写")
    print("=" * 50)

    # 获取用户输入
    source_folder = get_user_input("\n请输入源文件夹路径: ")
    base_target_folder = get_user_input("请输入目标文件夹路径: ")

    # 验证输入
    if not os.path.exists(source_folder):
        print(f"\n错误: 源文件夹 '{source_folder}' 不存在！")
        print("请确保路径正确，包含反斜杠和引号（如 E:\\image）")
        sys.exit(1)

    # 创建目标文件夹（如果不存在）
    if not os.path.exists(base_target_folder):
        os.makedirs(base_target_folder, exist_ok=True)

    # 执行分类移动
    print(f"\n开始处理: 源文件夹 = {source_folder}")
    print(f"目标文件夹 = {base_target_folder}\n")

    classify_and_move_files(source_folder, base_target_folder)

    # 统计处理文件数
    total_files = len([f for f in os.listdir(source_folder)
                       if f.lower().endswith(('.jpg', '.jpeg', '.tif', '.tiff'))])
    print(f"\n分类移动完成！共处理 {total_files} 个文件")


if __name__ == "__main__":
    # 确保在打包后也能正确运行
    if getattr(sys, 'frozen', False):
        # PyInstaller 打包后，使用原始路径
        base_dir = sys._MEIPASS
        print(f"运行于打包环境: {base_dir}")
    else:
        # 开发环境
        base_dir = os.path.dirname(os.path.abspath(__file__))

    # 启动主程序
    main()